Lesson 10

  • Python Basic, Lesson 4, v1.0.1, 2016.12 by David.Yi
  • Python Basic, Lesson 4, v1.0.2, 2017.03 modified by Yimeng.Zhang
  • v1.1, 2020.4 edit by David Yi

本次内容要点

  • 函数不同参数形式
  • 匿名函数
  • 思考:函数可变参数

函数不同参数形式

位置参数和默认参数

位置参数:必须按照顺序准确传递,如果数量和顺序不对,就会可能造成程序错误;调用函数时候,如果写了参数名称,那么位置就不重要了。
默认参数:在参数申明的时候跟一个用于默认值的赋值语句,如果调用函数的时候没有给出值,那么这个赋值语句就执行。

注意:所有必须的参数要在默认参数之前

默认参数的好处:

  • 减少程序复杂度
  • 降低程序错误可能性
  • 更好的兼容性

可变长度的参数-元组和字典

可变长度的参数,分为不提供关键字和提供关键字两种模式,分别为元组 tuple 和字典 dict。

可变长度的参数,如果是提供关键字,就是字典 dict,需要提供 key – value。

将字典作为参数传递的时候,可以直接传一个字典变量,也可以在参数列表中写明 key 和 value。

函数参数小结

  • 位置参数
  • 默认参数
  • 元组参数,一个星号
  • 字典参数,两个星号,需要传递 key 和 value

In [17]:
# 函数默认参数

def cal_0(money, rate=0.1):
    return money + money * rate 

print(cal_0(100))
print(cal_0(100,0.2))
print(cal_0(rate=0.3,money=100))


110.0
120.0
130.0

In [25]:
# 函数默认参数

def cal_1(money, bonus=1000, month=12a=1,b=2):
    i = money * month + bonus 
    return i

print(cal_1(5000))
print(cal_1(5000, 2000))
print(cal_1(5000, 2000, 10))


61000
62000
52000

In [ ]:
# 画一个三角形 ,n=高度
'''
       *
      ***
     *****
    *******
   *********
  ***********
 *************

'''

In [1]:
# 函数默认参数

def draw_triangle(n=5):

    for i in range(n+1):
        print(' '*(n-i),'*'*(2*i-1))
        
draw_triangle(3)


    
   *
  ***
 *****

In [2]:
draw_triangle(7)


        
       *
      ***
     *****
    *******
   *********
  ***********
 *************

In [3]:
# 函数可变长度的参数 元组

# 计算平均数
def cal_2(kind, *numbers):
    if kind == 'avg':
        n = 0
        for i in numbers:
            n = n + i
        return n / len(numbers)

t = cal_2('avg', 1,2,3,4)
print(t)


2.5

In [4]:
# 函数可变长度的参数 元组
# 输入计算的类别,输入要计算的数字

def cal_3(kind, *numbers):
    
    if kind == 'avg':
        n = 0
        for i in numbers:
            n = n + i
        return n / len(numbers)
    if kind == 'sum':
        n = 0
        for i in numbers:
            n = n + i
        return n
    
print(cal_3('avg', 1,2,3,4))
print(cal_3('sum', 1,2,3,4))

# 如果已经有一个list或者tuple,要要作为可变参数传给函数怎么办?
# 在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
print(cal_3('sum',*[1,2,3,4]))


2.5
10
10

In [12]:
# 函数可变长度的参数 元组
# 简化程序逻辑

def cal_4(kind, *numbers):
    
    n = 0
    for i in numbers:
        n = n + i
    
    if kind == 'avg':
        return n / len(numbers)
    if kind == 'sum':
        return n
    
print(cal_4(kind='avg', 1,2,3,4))
print(cal_4('sum', 1,2,3,4))


2.5
10

In [7]:
# 传递元组和字典参数优雅的写法

def cal_5(*numbers, **kw):
    
    # 判断是否有 kind 这个 key
    if 'kind' in kw:
        kind_value = kw.get('kind')
    
    n = 0
    for i in numbers:
        n = n + i
        
    if kind_value == 'avg':
        return n / len(numbers)
    if kind_value == 'sum':
        return n
    
print(cal_5(1,2,3,4,kind='avg',max='ignore'))
print(cal_5(1,2,3,4,kind='sum'))


2.5
10

匿名函数

Python 允许用 lambda 关键字创造匿名函数。 lambda 匿名函数不需要常规函数的 def 和 return 关键字,因为匿名函数代码较短,因此适用于一些简单处理运算的场景。


In [ ]:
# 等价的函数一般写法和匿名函数写法

def add(x, y):
    return x + y

lambda x, y: x + y

In [9]:
a =  lambda x, y=2 : x + y 
a(3)


Out[9]:
5

In [10]:
a(3, 5)


Out[10]:
8

In [11]:
a = lambda x : x * x +40

print(a(2))


44

In [9]:
# 计算一个正整数的因数

def yinshu(number):
    b = []
    for i in range(1,number+1):
        if number % i == 0:
            b.append(i)
    return b

print(yinshu(10))


[1, 2, 5, 10]

In [2]:
print(func(10))


1
2
5
10
[1, 2, 5, 10]

In [4]:
# 找到最大数 #1

def find_max(l):
    
    # max = float('-inf') 表示负无穷大
    max = float('-inf')
    for x in l:
        if x > max:
            max = x
    return max

print(find_max([-20,1,6,7,20,5]))
print(find_max([-20,-3,-6,-7,-5]))


20
-3

In [5]:
# 找到最大数 #2
# 使用递归

def find_max(l):
    if len(l) == 1:
        return l[0]
    v1 = l[0]
    v2 = find_max(l[1:])
    if v1 > v2:
        return v1
    else:
        return v2

print(find_max([1,6,7,20,5]))


20

思考

函数可变参数练习,kind中增加 max 这个key,如果设置为 ignore,则输入的数字中的最大数忽略


In [3]:
# kind 中 增加 max key, 
# max = ingnore, 则忽略最大值
def cal_6(*numbers, **kind):
    
    if 'kind' in kind:
        kind_value = kind.get('kind')
        
    if 'max' in kind:
        if kind.get('max') == 'ignore':
            numbers = list(numbers)
            numbers.remove(max(numbers))
    
    n = 0
    for i in numbers:
        n = n + i
        
    if kind_value == 'avg':
        return n / len(numbers)
    if kind_value == 'sum':
        return n
    
print(cal_6(1,2,3,4, kind='avg', max='ignore',min='ignore'))
print(cal_6(1,2,3,4, kind='avg'))
print(cal_6(1,2,3,4, kind='sum'))


2.0
2.5
10

In [4]:
# kind 中 增加 min key,
# min key = double, 则最小值计算两次

def cal_7(*numbers, **kw):
    
    numbers = list(numbers)
    
    if 'kind' in kw:
        kind_value = kw.get('kind')
        
    if 'max' in kw:
        if kw.get('max') == 'ignore':
            numbers.remove(max(numbers))

    if 'min' in kw:
        if kw.get('min') == 'double':
            numbers.append(min(numbers))
            
    n = 0
    for i in numbers:
        n = n + i
        
    if kind_value == 'avg':
        return n / len(numbers)
    if kind_value == 'sum':
        return n
    
print(cal_7(1,2,3,4, kind='avg', max='ignore', min='double'))
print(cal_7(1,2,3,4, kind='avg'))
print(cal_7(1,2,3,4, kind='sum'))


1.75
2.5
10

In [ ]: